package Interfaz;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

import Algoritmo.Cromosoma;
import Clases.Arbol;
import Clases.Arbol.O;
import Clases.Arbol.T;
import Clases.Espacio;
import Clases.Tablero;
import Clases_Auxiliares.DistanciaTiempo;

public class TableroFichas extends TableroJuego {
	public final static int INTERVAL = 1000;
	
	
	public TableroFichas(Tablero tablero){
		super(tablero);
	}
	
	public void inicializar(){
		super.repaint();
	}
	public TableroFichas(Cromosoma c){
		super(c.getEspacioSimulacion().getTablero());
	}
	
	public int evaluar(Arbol arbol,Espacio espacio,DistanciaTiempo dt){
		int valor1 = 0;
		int valor2 = 0;
		int valor3 = 0;
		
		
		try{
			Thread.sleep(35);
			this.repaint();
			this.revalidate();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}	
		
		int nueva_distancia = 0;
		T t = arbol.getTerminal();
		O o = arbol.getOperador();
		if(arbol.isHoja()){
			if (t == T.FUEGO){
				if (!espacio.isHayMisil()){
					espacio.setHayMisil(true);
					espacio.setPosicionMisil(espacio.getDefensor().getX()-1,espacio.getDefensor().getY());
					espacio.setSeDisparoMisil(true);
					try{
						Thread.sleep(35);
						this.repaint();
						this.revalidate();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				dt.avanzarTiempo();
				nueva_distancia = espacio.avanzarTiempo();
				dt.aumentarDistacia(nueva_distancia);
			}else if (t == T.IZQUIERDA){
				int y = espacio.getDefensor().getY();
				if(y > 0){
					espacio.setPosicionDefensor(espacio.getDefensor().getX(),y-1);
					try{
						Thread.sleep(35);
						this.repaint();
						this.revalidate();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				dt.avanzarTiempo();
				nueva_distancia = espacio.avanzarTiempo();
				dt.aumentarDistacia(nueva_distancia);
			}else if (t == T.DERECHA){
				int y = espacio.getDefensor().getY();
				if(y < (espacio.getTamTablero() - 1) ){
					espacio.setPosicionDefensor(espacio.getDefensor().getX(),y + 1);
					try{
						Thread.sleep(35);
						this.repaint();
						this.revalidate();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				dt.avanzarTiempo();
				nueva_distancia = espacio.avanzarTiempo();
				dt.aumentarDistacia(nueva_distancia);
			}else if (t == T.DIST_Y){
				valor1 = espacio.getAlien().getX();
				return valor1;
			}else if (t == T.DIST_X){
				valor1 = Math.abs(espacio.getDefensor().getY() - espacio.getAlien().getY());
				if (espacio.seAlejanAlienDefensor()) valor1 = - valor1;
				return valor1;
			}
		}else{
			if (o == O.IF){
				valor1 = evaluar(arbol.getHijoIzq(),espacio,dt);
				if (!espacio.isTermina()){
					if (valor1 != 0) return evaluar(arbol.getHijoCen(),espacio,dt);
					else return evaluar(arbol.getHijoDer(),espacio,dt);
				}
			}else if (o == O.PROGN2){
				valor1 = evaluar(arbol.getHijoIzq(),espacio,dt);
				if (!espacio.isTermina()){
					valor2 = evaluar(arbol.getHijoDer(),espacio,dt);
					return valor1 + valor2;
				}
			}else if (o == O.PROGN3){
				valor1 = evaluar(arbol.getHijoIzq(),espacio,dt);
				if (!espacio.isTermina()){
					valor2 = evaluar(arbol.getHijoCen(),espacio,dt);
					if (!espacio.isTermina()){
						valor3 = evaluar(arbol.getHijoDer(),espacio,dt);
						return valor1 + valor2 + valor3;
					}
				}
			}else if (o == O.EQ){
				valor1 = evaluar(arbol.getHijoIzq(),espacio,dt);
				if (!espacio.isTermina()){
					valor2 = evaluar(arbol.getHijoDer(),espacio,dt);
					if (valor1 == valor2) return 1;
					else return 0;
				}
			}
		}
		return 0;
	}
	
	public void adaptacion(Arbol arbol, Espacio espacio){
		int tiempo,tiempo_anterior;
		int distancia, nueva_distancia = 0;
		boolean[] termina = {false,false};
			tiempo = 0;
			distancia = 0;
			termina = espacio.terminacion();
			DistanciaTiempo dt = new DistanciaTiempo(distancia,tiempo);
			while (!termina[0]){
				tiempo_anterior = tiempo;
				evaluar(arbol,espacio,dt);
				tiempo = dt.getTiempo();
				if (tiempo_anterior == tiempo){
					tiempo = tiempo + 1;
					nueva_distancia = espacio.avanzarTiempo();
					distancia = distancia + nueva_distancia;
				}else{
					distancia = distancia + dt.getDistancia();
				}
				termina = espacio.terminacion();
			}
		
	}
}